package com.java.star.mall.common.exception.handler;

import com.java.star.mall.common.exception.BusinessException;
import com.java.star.mall.common.response.JsonResult;
import com.java.star.mall.common.response.StatusCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.Objects;

/**
 * 全局异常处理器
 */
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    /**
     * 全局处理业务异常
     *
     * @param e 业务异常
     * @return 错误响应对象
     */
    @ExceptionHandler
    public JsonResult<Void> handlerBusinessException(BusinessException e) {
        log.debug("全局异常处理器开始处理BusinessException");
        log.debug("异常跟踪信息如下：", e);
        return JsonResult.fail(e.getCode(), e.getMsg());
    }

    /**
     * 全局处理参数效验异常
     *
     * @param e 参数异常
     * @return 错误响应对象
     */
    @ExceptionHandler
    public JsonResult<Void> handlerBindException(BindException e) {
        log.debug("全局异常处理器开始处理BindException");
        log.debug("异常跟踪信息如下：", e);
        String message = Objects.requireNonNull(e.getFieldError()).getDefaultMessage();
        return  JsonResult.fail(StatusCode.VALIDATE_ERROR.getCode(), message);
    }

    @ExceptionHandler
    public JsonResult<Void> handlerThrowable(Throwable e) {
        log.debug("全局异常处理器开始处理Throwable");
        log.debug("异常跟踪信息如下：", e);
        return JsonResult.fail(StatusCode.SYSTEM_ERROR.getCode(), "服务器开小差了，请稍后重试!");
    }
}
